//
// Description: 数字拆分
// Created by Loading on 2021/4/16.
//

// 雪球和大栗在玩一个数学游戏，雪球每次告诉大栗一个数n（n>1），大栗需要找到一个数列 a1,a2……..ak 满足
// 1、每个 ai 都大于1；
// 2、a1 * a2 * … * ak = n
// 3、ai+1 被 ai 整除 (1 <= i <= k - 1)
// 4、k 是最大的情况
//
// 如果有多个满足k最大的序列，给出任何一个有效序列即可。

// Input
// 第一行为一个整数t（1<=t<=5000），表示了测试用例的数量。
// 后边t行每行一个测试用例，每个测试用例只有一个整数n（2<=n<=10^10）
// 能够保证，所有测试用例的n求和不会超过10^10
//
// Output
// 对于每一组数据，输出答案：第一行输出一个整数 k 表示 a 数组的最大长度，在第二行，输出完整的 a 数组
// 如果有多个可能的答案，如果多种可能，输出1个即可。

// Example
//
// Input
// 4
// 2
// 1080
// 8589934592
// 1791398
//
// Output
// 1
// 2
// 3
// 2 6 90
// 33
// 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
// 1
// 1791398

/* 从最小可能成为质因数的2开始，不断整除2，直到不能整除，贪心求k为最长的时候质因数集合 */
/* 从2一直计算到每个case的开方 */

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

int main() {
    int t;
    cin >> t;
    vector<ll> cases;
    while (t--) {
        ll temp;
        cin >> temp;
        cases.emplace_back(temp);
    }

    for (auto &x : cases) {
        vector<ll> res; //数列集合
        ll res_size = 0;//k最大时的长度
        ll calc = x;

        /* 求因子，降低时间复杂度，只需要遍历到根号x即可，O(n) = 根号n * log(n) */
        for (int i = 2; i <= sqrt(x); ++i) {
            vector<ll> vec;
            //要求是 ai+1 被 ai 整除，所以被i整除后还需要再被i整除
            while (calc % i == 0 && (calc / i) % i == 0) {
                vec.emplace_back(i);
                calc /= i;
            }
            //更新k最大时候的长度和数列集合
            if (vec.size() > res_size) {
                res_size = vec.size();
                res = vec;
            }
            calc = x;
        }

        //没有找到符合条件的集合
        if (res_size == 0) {
            cout << 1 << endl;
            cout << x << endl;
        } else {
            cout << res_size << endl;
            for (auto &temp : res) {
                cout << temp << " ";
            }
            cout << endl;
        }
    }
}